<!doctype html>



  


<html class="theme-next pisces use-motion">
<head>
  <meta charset="UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"/>



<meta http-equiv="Cache-Control" content="no-transform" />
<meta http-equiv="Cache-Control" content="no-siteapp" />












  
  
  <link href="/vendors/fancybox/source/jquery.fancybox.css?v=2.1.5" rel="stylesheet" type="text/css" />




  
  
  
  

  
    
    
  

  

  

  

  

  
    
    
    <link href="//fonts.googleapis.com/css?family=Lato:300,300italic,400,400italic,700,700italic&subset=latin,latin-ext" rel="stylesheet" type="text/css">
  






<link href="/vendors/font-awesome/css/font-awesome.min.css?v=4.4.0" rel="stylesheet" type="text/css" />

<link href="/css/main.css?v=5.0.1" rel="stylesheet" type="text/css" />


  <meta name="keywords" content="王雨峰, 博客" />








  <link rel="shortcut icon" type="image/x-icon" href="/favicon.ico?v=5.0.1" />






<meta name="description" content="Alan Wang&apos;s personal blog.">
<meta property="og:type" content="website">
<meta property="og:title" content="王雨峰的博客">
<meta property="og:url" content="http://wangyufeng.org/index.html">
<meta property="og:site_name" content="王雨峰的博客">
<meta property="og:description" content="Alan Wang&apos;s personal blog.">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="王雨峰的博客">
<meta name="twitter:description" content="Alan Wang&apos;s personal blog.">



<script type="text/javascript" id="hexo.configuration">
  var NexT = window.NexT || {};
  var CONFIG = {
    scheme: 'Pisces',
    sidebar: {"position":"left","display":"post"},
    fancybox: true,
    motion: true,
    duoshuo: {
      userId: 0,
      author: '博主'
    }
  };
</script>




  <link rel="canonical" href="http://wangyufeng.org/"/>

  <title> 王雨峰的博客 </title>
</head>

<body itemscope itemtype="http://schema.org/WebPage" lang="zh-Hans">

  










  
  
    
  

  <div class="container one-collumn sidebar-position-left 
   page-home 
 ">
    <div class="headband"></div>

    <header id="header" class="header" itemscope itemtype="http://schema.org/WPHeader">
      <div class="header-inner"><div class="site-meta ">
  

  <div class="custom-logo-site-title">
    <a href="/"  class="brand" rel="start">
      <span class="logo-line-before"><i></i></span>
      <span class="site-title">王雨峰的博客</span>
      <span class="logo-line-after"><i></i></span>
    </a>
  </div>
  <p class="site-subtitle">随便写点东西，为互联网贡献一些比特~</p>
</div>

<div class="site-nav-toggle">
  <button>
    <span class="btn-bar"></span>
    <span class="btn-bar"></span>
    <span class="btn-bar"></span>
  </button>
</div>

<nav class="site-nav">
  

  
    <ul id="menu" class="menu">
      
        
        <li class="menu-item menu-item-home">
          <a href="/" rel="section">
            
              <i class="menu-item-icon fa fa-fw fa-home"></i> <br />
            
            首页
          </a>
        </li>
      
        
        <li class="menu-item menu-item-about">
          <a href="/about" rel="section">
            
              <i class="menu-item-icon fa fa-fw fa-user"></i> <br />
            
            关于
          </a>
        </li>
      
        
        <li class="menu-item menu-item-archives">
          <a href="/archives" rel="section">
            
              <i class="menu-item-icon fa fa-fw fa-archive"></i> <br />
            
            归档
          </a>
        </li>
      

      
    </ul>
  

  
</nav>

 </div>
    </header>

    <main id="main" class="main">
      <div class="main-inner">
        <div class="content-wrap">
          <div id="content" class="content">
            
  <section id="posts" class="posts-expand">
    
      

  
  

  
  
  

  <article class="post post-type-normal " itemscope itemtype="http://schema.org/Article">

    
      <header class="post-header">

        
        
          <h1 class="post-title" itemprop="name headline">
            
            
              
                
                <a class="post-title-link" href="/2016/09/03/图解密码技术读书笔记/" itemprop="url">
                  《图解密码技术》读书笔记
                </a>
              
            
          </h1>
        

        <div class="post-meta">
          <span class="post-time">
            <span class="post-meta-item-icon">
              <i class="fa fa-calendar-o"></i>
            </span>
            <span class="post-meta-item-text">发表于</span>
            <time itemprop="dateCreated" datetime="2016-09-03T14:55:57+08:00" content="2016-09-03">
              2016-09-03
            </time>
          </span>

          

          
            
          

          

          
          

          
        </div>
      </header>
    


    <div class="post-body" itemprop="articleBody">

      
      

      
        
          
            <p>通过这本书，捋了一遍密码技术中的各种名词，有些在以前不理解其含义的词，现在大体有个概念了，开心。</p>
<p>‘图灵程序设计丛书’每一本都很喜欢。在读这本书的时候，隐约想起了《信息简史》这本书中的一些内容，比如信息的压缩、信息的意义等等。等时机成熟，再重读一遍《信息简史》。</p>
<p>另外，”密钥”这个词真的是读”密yue”吗，感觉好奇怪啊=。=</p>
<h1 id="脉络（目录结构）"><a href="#脉络（目录结构）" class="headerlink" title="脉络（目录结构）"></a>脉络（目录结构）</h1><ul>
<li>密码<ul>
<li>经典密码</li>
<li>对称密码</li>
<li>分组密码</li>
<li>公钥密码</li>
<li>混和密码系统</li>
</ul>
</li>
<li>认证<ul>
<li>单向散列函数</li>
<li>消息认证码</li>
<li>数字签名</li>
<li>证书</li>
</ul>
</li>
<li>密钥、随机数与应用技术<ul>
<li>密钥</li>
<li>随机数</li>
<li>PGP</li>
<li>SSL/TLS</li>
<li>密码技术与现实社会</li>
</ul>
</li>
</ul>
<h1 id="密码"><a href="#密码" class="headerlink" title="密码"></a>密码</h1><h2 id="密码与信息安全常识"><a href="#密码与信息安全常识" class="headerlink" title="密码与信息安全常识"></a>密码与信息安全常识</h2><ul>
<li>不要使用保密的密码算法，即，不要依赖于”隐蔽式安全性”。公开的算法是最安全的，算法的效果取决于”种子”。</li>
<li>与其使用低强度的密码，不如不使用密码。</li>
<li>没有永恒安全的密码。</li>
<li>密码只是信息安全的一部分(e.g. 社工)。</li>
</ul>
<h2 id="传统密码"><a href="#传统密码" class="headerlink" title="传统密码"></a>传统密码</h2><ul>
<li>凯撒密码：字母表平移。可暴力破解。</li>
<li>简单替换密码：字母表映射。可通过频率分析破解。</li>
<li>Enigma。Enigma的设计就不依赖于”隐蔽式安全性”，即，机器被敌军捕获了也没关系。有一段阿兰·图灵的故事。</li>
</ul>
<h2 id="对称密码"><a href="#对称密码" class="headerlink" title="对称密码"></a>对称密码</h2><ul>
<li>对称密码：加密密钥和解密密钥一样。</li>
<li>一次性密码本：从数学理论上就绝对无法被破解的密码，量子计算机也不行。但没被实际应用，原因是密钥配送和密钥长度是问题。不能被破解的原因：解密文本包含原文的所有排列组合空间。</li>
<li>DES：分组密码的一种。结构是 Feistel 网络。已经弃用。</li>
<li>三重 DES：DES 的加强版。</li>
<li>AES：AES所采用的算法：Rijndael。AES 是对称密码的首选。</li>
</ul>
<h2 id="分组密码"><a href="#分组密码" class="headerlink" title="分组密码"></a>分组密码</h2><ul>
<li>分组密码：每次只能处理特定长度的一块数据的一类密码算法。</li>
<li>模式：  <ul>
<li>ECB（不要使用）</li>
<li>CBC</li>
<li>CFB</li>
<li>OFB</li>
<li>CTR</li>
</ul>
</li>
</ul>
<h2 id="公钥密码"><a href="#公钥密码" class="headerlink" title="公钥密码"></a>公钥密码</h2><ul>
<li>公钥密码的诞生：解决”密码配送问题”，即，密钥的传输过程中如何保证不被窃听。</li>
<li>密码配送问题的解决方案：<ol>
<li>通过事先共享密钥</li>
<li>通过密钥分配中心</li>
<li>通过 Diffie-Hellman 密钥交换</li>
<li>通过公钥密码</li>
</ol>
</li>
<li>公钥密码的含义：Alice 想要发送秘密的信息给 Bob，但是密钥的发送不能保证安全性(密钥也需要加密，但加密密钥的密钥保证不了安全)，于是 Bob(接收者) 就生成一个密钥对（公私钥），把公钥发给 Alice，这个公钥全世界都能看。Alice 用 Bob 的公钥把信息加密，发给 Bob。Bob 再用自己的私钥解密这个消息。因为 Bob 私钥根本就没进行”发送”，一直在自己手上，所以即便密文被被窃听，窃听者也解密不了，因为没有私钥。</li>
<li>公私钥之间具有紧密的数学联系。</li>
<li>一旦发现了对大整数进行质因数分解的高效算法，RSA 就被破解。</li>
<li>P=NP？ &lt;—&gt; 具有该高效算法</li>
<li>RSA 的不足：中间人攻击。通过证书解决。</li>
</ul>
<h2 id="混合密码系统"><a href="#混合密码系统" class="headerlink" title="混合密码系统"></a>混合密码系统</h2><ul>
<li>由于公钥密码的速度比对称密码慢很多，所以解决方案是：用对称密码加密明文，然后将对称密码的密钥用公钥密码加密。</li>
</ul>
<h1 id="认证"><a href="#认证" class="headerlink" title="认证"></a>认证</h1><h2 id="单向散列函数"><a href="#单向散列函数" class="headerlink" title="单向散列函数"></a>单向散列函数</h2><ul>
<li>求比特序列的 Hash 值。即，序列的特征值，只能单向运算（不能逆推），计算速度快，一般长度固定。也叫作指纹。</li>
<li>不同的消息散列值也不同，除非出现碰撞。</li>
<li>MD5（安全性已不能保证）</li>
<li>SHA-2</li>
<li>SHA-3(最新，使用了和 SHA-1和 SHA-2 不同的结构，即 Keccak)</li>
<li>对单向散列函数的攻击：<ul>
<li>暴力破解（碰撞，对抗弱抗碰撞性）</li>
<li>生日攻击（碰撞，对抗强抗碰撞性）</li>
</ul>
</li>
</ul>
<h2 id="消息验证码"><a href="#消息验证码" class="headerlink" title="消息验证码"></a>消息验证码</h2><ul>
<li>简称 MAC，Message Authentication Code</li>
<li>是一种与密钥相关联的单向散列函数</li>
<li>双方需要共享密钥</li>
<li>可以使用单向散列函数实现，也可以使用分组密钥实现</li>
<li>对消息验证码的攻击：重放攻击、密钥推测攻击。</li>
<li>消息验证码的缺点：不能对第三方验证（证书可解决），不能防止”否认”。</li>
</ul>
<h2 id="数字签名"><a href="#数字签名" class="headerlink" title="数字签名"></a>数字签名</h2><ul>
<li>即，将 RSA 的过程反过来。用私钥加密自己的信息，所有人可用公开的公钥来验证。</li>
<li>数字签名的方法：对消息进行签名(量大，且机密性不是数字签名的需求)。所以使用：对散列值进行签名。</li>
<li>“数字签名”一词中的”签名”，是”signature”，不是”autograph”.</li>
<li>对数字签名的攻击：中间人攻击、对单向散列函数攻击、利用数字签名攻击公钥密码（所以绝对不要对不明来源的信息进行签名）、潜在伪造。</li>
<li>为了确认自己用于验证数字签名的公钥是否合法，需要使用证书。</li>
</ul>
<h2 id="证书"><a href="#证书" class="headerlink" title="证书"></a>证书</h2><ul>
<li>即，证书颁发机构用自己的私钥，对一个需要验证的公钥进行数字签名，并发布自己的公钥。</li>
<li>信任链递归了怎么办？Root CA。理论上，如果能够取得可信的公钥，就不需要认证机构。即，</li>
<li>公钥基础设施（PKI）</li>
<li>如果证书作废，发布 CRL。作为用户一定及时更新 CRL。</li>
</ul>
<h1 id="第三部分"><a href="#第三部分" class="headerlink" title="第三部分"></a>第三部分</h1><p>##密钥</p>
<ul>
<li>密钥的本质：一个巨大的整数</li>
<li>分类<ul>
<li>对称密码的密钥、公钥密码的密钥</li>
<li>消息认证码的密钥、数字签名的密钥</li>
<li>用于确保机密性的密钥、用于认证的密钥</li>
<li>会话密钥、主密钥</li>
</ul>
</li>
<li>内容加密密钥：CEK</li>
<li>密钥加密密钥：KEK</li>
<li>生成密钥：使用专门针对密码学设计的伪随机数生成器</li>
<li>基于口令的密钥：最后一层保障放在大脑里</li>
<li>密钥的配送（e.g. RSA）</li>
<li>密钥的更新（e.g. 散列值递归，具备”向后安全”）</li>
<li>密钥的作废：CRL</li>
</ul>
<p>如何生成安全的密钥：</p>
<ul>
<li>不使用自己的信息、不使用别人的有关信息、不使用逻辑上顺序的一系列密码。</li>
</ul>
<h2 id="随机数"><a href="#随机数" class="headerlink" title="随机数"></a>随机数</h2><p>随机数发生器对密钥的生成很重要。</p>
<p>随机数的特性：</p>
<ul>
<li>随机性</li>
<li>不可预测性</li>
<li>不可重现性</li>
</ul>
<p>只具有随机性的是弱伪随机数、具有随机性和不可预测性的是强伪随机数、具有三者的是真随机数。</p>
<ul>
<li>软件生成的随机数只能是伪随机数。真随机数需要靠物理传感器等硬件设备生成。</li>
</ul>
<p>线性同余法：具有随机性，但是不具有不可预测性，所以不能用于密码学的随机数。c 语言标准库中的 rand() 就使用的是线性同余法。</p>
<p>生成伪随机数列的方法：</p>
<ul>
<li>散列法</li>
<li>密码法</li>
</ul>
<p>伪随机数生成器的种子：真随机数。</p>
<h2 id="PGP"><a href="#PGP" class="headerlink" title="PGP"></a>PGP</h2><ul>
<li>Pretty Good Privary, 一个包含各类密码工具的密码软件。</li>
<li>采用”信任网”，不依赖特定的认证机构。去中心化。</li>
</ul>
<h2 id="SSL-TLS"><a href="#SSL-TLS" class="headerlink" title="SSL/TLS"></a>SSL/TLS</h2><ul>
<li>结合对称密码、公钥密码、单向散列函数、消息认证码、伪随机数发生器、数字签名等技术。</li>
<li>对 HTTP 协议的保护，即 HTTPS</li>
<li>也可以用于保护其他协议</li>
<li>心脏出血漏洞：利用的是 OpenSSL 对 TLS 实现上的缺陷。</li>
</ul>
<h2 id="密码技术与现实社会"><a href="#密码技术与现实社会" class="headerlink" title="密码技术与现实社会"></a>密码技术与现实社会</h2><p>###小结</p>
<ul>
<li>对称密钥是一种用相同的密钥进行加密和解密的技术，用于确保消息的机密性，目前对称密码的算法主要使用 AES。但存在密码配送问题，用公钥密码解决。</li>
<li>公钥密码是一种使用不同的密钥进行加密和解密的技术，同样用于确保消息的机密性。速度很慢，一般和对称密钥组成混和密码系统。但存在中间人攻击的问题，用数字签名和证书解决。</li>
<li>单向散列函数是一种将长消息转换为短散列值的技术，用于确保消息的完整性。主要使用 SHA-2和 SHA-3.</li>
<li>消息认证码是一种能够识别通信对象发送的消息是否被篡改的认证技术，用于验证消息的完整性，以及对消息进行验证。常用的算法是 HMAC。</li>
<li>数字签名是一种能够对第三方进行消息认证，并能够防止通信对象作出否认的认证技术。算法包括 RSA 等。公钥基础设施（PKI）中所使用的证书，就是对公钥加上认证机构的数字签名所构成的。要验证公钥的数字签名，需要通过某种途径获取认证机构自身的合法公钥。</li>
<li><p>伪随机数发生器是一种能够生成具备不可预测性的比特序列的技术，由密码和单向散列函数等技术构成。</p>
</li>
<li><p>密码技术的框架化：可方便地替换掉不再安全的密码技术。</p>
</li>
<li><p>密码技术实际上可以看成压缩技术。</p>
</li>
</ul>
<p>关于比特币：</p>
<ul>
<li>区块链</li>
<li>P2P 网络</li>
<li>挖矿</li>
<li>椭圆曲线</li>
</ul>
<p>关于完美：</p>
<ul>
<li>没有完美的密码技术。即使有完美的密码技术，使用密码技术的也是不完美的人。完美的安全性是无法达到的。</li>
</ul>
<p>椭圆曲线：</p>
<ul>
<li>既不是”椭圆”，也不是”曲线”(是离散值)</li>
<li>椭圆曲线上的运算相当于在包含椭圆曲线上所有点以及无限远点的集合上的阿贝尔群，群以无限远点 O 为单位元。（已经忘记阿贝尔群是啥意思了 Σ(°Д°; 罪过啊）</li>
</ul>
<hr>
<p>2016.9.3</p>

          
        
      
    </div>

    <div>
      
    </div>

    <div>
      
    </div>

    <footer class="post-footer">
      

      

      
      
        <div class="post-eof"></div>
      
    </footer>
  </article>


    
      

  
  

  
  
  

  <article class="post post-type-normal " itemscope itemtype="http://schema.org/Article">

    
      <header class="post-header">

        
        
          <h1 class="post-title" itemprop="name headline">
            
            
              
                
                <a class="post-title-link" href="/2016/08/31/internship-summary/" itemprop="url">
                  在创宇实习两个月的收获和感悟
                </a>
              
            
          </h1>
        

        <div class="post-meta">
          <span class="post-time">
            <span class="post-meta-item-icon">
              <i class="fa fa-calendar-o"></i>
            </span>
            <span class="post-meta-item-text">发表于</span>
            <time itemprop="dateCreated" datetime="2016-08-31T20:36:53+08:00" content="2016-08-31">
              2016-08-31
            </time>
          </span>

          

          
            
          

          

          
          

          
        </div>
      </header>
    


    <div class="post-body" itemprop="articleBody">

      
      

      
        
          <p>大三之前的这个暑假，我在知道创宇实习了两个月，收获颇丰。在公司里，每周末要写周报：总结本周工作内容、计划下周工作内容和随便说点啥。现在全职实习的阶段结束了，我也写个”两月报”，总结我实习过程中的收获、展望将来的计划。</p>
          <div class="post-more-link text-center">
            <a class="btn" href="/2016/08/31/internship-summary/#more" rel="contents">
              阅读全文 &raquo;
            </a>
          </div>
        
      
    </div>

    <div>
      
    </div>

    <div>
      
    </div>

    <footer class="post-footer">
      

      

      
      
        <div class="post-eof"></div>
      
    </footer>
  </article>


    
      

  
  

  
  
  

  <article class="post post-type-normal " itemscope itemtype="http://schema.org/Article">

    
      <header class="post-header">

        
        
          <h1 class="post-title" itemprop="name headline">
            
            
              
                
                <a class="post-title-link" href="/2016/07/24/工大野生助手/" itemprop="url">
                  工大野生助手
                </a>
              
            
          </h1>
        

        <div class="post-meta">
          <span class="post-time">
            <span class="post-meta-item-icon">
              <i class="fa fa-calendar-o"></i>
            </span>
            <span class="post-meta-item-text">发表于</span>
            <time itemprop="dateCreated" datetime="2016-07-24T12:48:29+08:00" content="2016-07-24">
              2016-07-24
            </time>
          </span>

          

          
            
          

          

          
          

          
        </div>
      </header>
    


    <div class="post-body" itemprop="articleBody">

      
      

      
        
          
            <h1 id="工大野生助手"><a href="#工大野生助手" class="headerlink" title="工大野生助手"></a>工大野生助手</h1><p><a href="https://github.com/wangyufeng0615/bjuthelper" target="_blank" rel="external">https://github.com/wangyufeng0615/bjuthelper</a></p>
<h2 id="访问量"><a href="#访问量" class="headerlink" title="访问量"></a>访问量</h2><p><img src="http://7xku3h.com1.z0.glb.clouddn.com/16-7-16/85684382.jpg" alt=""></p>
<h2 id="预览"><a href="#预览" class="headerlink" title="预览"></a>预览</h2><p><img src="http://7xku3h.com1.z0.glb.clouddn.com/16-7-23/12366574.jpg" alt=""><br><img src="http://7xku3h.com1.z0.glb.clouddn.com/16-7-23/47965690.jpg" alt=""></p>
<h2 id="功能"><a href="#功能" class="headerlink" title="功能"></a>功能</h2><ul>
<li>查某学期的各科成绩。</li>
<li>查所有学期总的加权平均分和平均GPA。</li>
</ul>
<h2 id="运行模式"><a href="#运行模式" class="headerlink" title="运行模式"></a>运行模式</h2><ul>
<li>这两个PHP页面运行在Apache中；</li>
<li>Apache安装在我的电脑上；</li>
<li>电脑连了学校的内网，也就是bjut-wifi或者插网线；</li>
<li>将自己电脑的80端口映射到外网。映射的方法很多，我用的是ngrok这个开源工具，也可以用花生壳等。</li>
<li>【手机端(扫二维码访问登陆页面)】&lt;—&gt;【外网映射服务器】&lt;–(学校网关)–&gt;【内网电脑,运行着Apache】&lt;—&gt;【教务网站】</li>
</ul>
<h2 id="细节"><a href="#细节" class="headerlink" title="细节"></a>细节</h2><ul>
<li><code>login_grade.php</code>负责登陆，<code>require_grade.php</code>负责具体的查询。</li>
</ul>
<h3 id="login-grade-php"><a href="#login-grade-php" class="headerlink" title="login_grade.php"></a>login_grade.php</h3><ul>
<li>UI用的是「WeUI」，微信团队做的，和微信的视觉效果一致；</li>
<li>每个学校的正方教务都不太一样，我的代码中的各种http header参数、post参数基本符合北工大的教务网站。</li>
<li>教务系统的默认登陆页面是<code>default2</code>，可以换换default后面的数字，可以有不需要验证码的登陆页面。</li>
</ul>
<h3 id="require-grade-php"><a href="#require-grade-php" class="headerlink" title="require_grade.php"></a>require_grade.php</h3><ul>
<li>中文编码容易出现乱码，涉及到本地IDE的编码、PHP的编码和网站的编码；</li>
<li>有两种post，第一种是登陆，第二种是获取成绩信息。获取成绩信息的时候有多次post，分别是获取某学期的成绩和获取总成绩；</li>
<li>构造POST的思路：打开浏览器开发者工具，先正常走一遍查询成绩的流程，观察POST数据的key和value，并在代码中构造；</li>
<li>由于页面返回的是一坨DIV，而且既没有name属性也没有id属性，所以需要将table标签整个转成array，并观察所需要的信息的位置，通过数组下标的方式访问；</li>
<li>总的平均GPA无法区分主修专业和二专业/辅修专业，因为查询所有科目的总成绩页面中没有任何标签能区分这两者。</li>
</ul>
<h2 id="其他"><a href="#其他" class="headerlink" title="其他"></a>其他</h2><ul>
<li>其实就是个爬虫，模拟了登陆正方教务系统并查询成绩的过程。Python写爬虫的话可能更方便，Python有个库requests，非常好用。</li>
<li>PHP中嵌入HTML感觉很不优雅，但HTML中嵌入PHP也好不到哪里去，有什么更好的办法吗？</li>
<li>网上有很多关于正方教务的东西，虽然不太容易直接照搬，但学习价值很大。table转html的函数我就是从网上找的。</li>
<li>交流请联系 807103724@qq.com，微信同QQ。</li>
<li>欢迎提交Issue和Pull Request！</li>
</ul>
<h2 id="LICENSE-假装我写出了一个开源的东西"><a href="#LICENSE-假装我写出了一个开源的东西" class="headerlink" title="LICENSE(假装我写出了一个开源的东西)"></a>LICENSE(假装我写出了一个开源的东西)</h2><p>MIT</p>

          
        
      
    </div>

    <div>
      
    </div>

    <div>
      
    </div>

    <footer class="post-footer">
      

      

      
      
        <div class="post-eof"></div>
      
    </footer>
  </article>


    
      

  
  

  
  
  

  <article class="post post-type-normal " itemscope itemtype="http://schema.org/Article">

    
      <header class="post-header">

        
        
          <h1 class="post-title" itemprop="name headline">
            
            
              
                
                <a class="post-title-link" href="/2016/07/14/mhn-install/" itemprop="url">
                  安装大型Linux软件时一些关于下载的坑
                </a>
              
            
          </h1>
        

        <div class="post-meta">
          <span class="post-time">
            <span class="post-meta-item-icon">
              <i class="fa fa-calendar-o"></i>
            </span>
            <span class="post-meta-item-text">发表于</span>
            <time itemprop="dateCreated" datetime="2016-07-14T11:33:19+08:00" content="2016-07-14">
              2016-07-14
            </time>
          </span>

          

          
            
          

          

          
          

          
        </div>
      </header>
    


    <div class="post-body" itemprop="articleBody">

      
      

      
        
          <p>分享一些收获。</p>
<p>有时候我们需要在Linux上安装一些大型的、组合性质的软件，软件一般都会提供安装脚本，脚本在执行的过程中会下载很多其他软件。鉴于我兔独特的网络环境，一般情况下安装过程都不会一帆风顺的。 以前安装过一个trac，当时怎么也没弄好，还好高老师为我指出一条康庄大道，就是用Bitnami的傻瓜安装包。我现在一琢磨，当时trac的问题应该就是依赖项没下载下来。Bitnami上确实有不少现成的安装包，如果大家需要在Linux下装大型软件的，比如LAMP啥的，不妨去看一看。带给你在Windows上安装软件的体验。</p>
<p>以前装过Openstack，这两天在弄MHN。虽然这两个东西都提供了安装脚本(<code>install.sh</code>)，但是脚本中要下载大量的依赖项，很多时候问题就出在依赖项的下载上。</p>
          <div class="post-more-link text-center">
            <a class="btn" href="/2016/07/14/mhn-install/#more" rel="contents">
              阅读全文 &raquo;
            </a>
          </div>
        
      
    </div>

    <div>
      
    </div>

    <div>
      
    </div>

    <footer class="post-footer">
      

      

      
      
        <div class="post-eof"></div>
      
    </footer>
  </article>


    
      

  
  

  
  
  

  <article class="post post-type-normal " itemscope itemtype="http://schema.org/Article">

    
      <header class="post-header">

        
        
          <h1 class="post-title" itemprop="name headline">
            
            
              
                
                <a class="post-title-link" href="/2016/07/10/wen-ming-zhi-guang-du-shu-bi-ji-1/" itemprop="url">
                  《文明之光1》读书笔记
                </a>
              
            
          </h1>
        

        <div class="post-meta">
          <span class="post-time">
            <span class="post-meta-item-icon">
              <i class="fa fa-calendar-o"></i>
            </span>
            <span class="post-meta-item-text">发表于</span>
            <time itemprop="dateCreated" datetime="2016-07-10T14:29:55+08:00" content="2016-07-10">
              2016-07-10
            </time>
          </span>

          

          
            
          

          

          
          

          
        </div>
      </header>
    


    <div class="post-body" itemprop="articleBody">

      
      

      
        
          <ul>
<li><p>作者：吴军</p>
</li>
<li><p>吴军是我很喜欢的作家，还写过《浪潮之巅》、《大学之路》，都很爱看。还有一本《数学之美》，不好意思看不懂。</p>
</li>
<li><p>文明之光算是很轻松的读物，也可能跟吴军也是理工科出身有关系，读他的文字总是觉得轻松而富有分量。曾经当当网打折的时候买过《全球通史》，有点看不下去。</p>
</li>
<li><p>主要是摘抄，也有我的一些感想。</p>
</li>
</ul>
          <div class="post-more-link text-center">
            <a class="btn" href="/2016/07/10/wen-ming-zhi-guang-du-shu-bi-ji-1/#more" rel="contents">
              阅读全文 &raquo;
            </a>
          </div>
        
      
    </div>

    <div>
      
    </div>

    <div>
      
    </div>

    <footer class="post-footer">
      

      

      
      
        <div class="post-eof"></div>
      
    </footer>
  </article>


    
      

  
  

  
  
  

  <article class="post post-type-normal " itemscope itemtype="http://schema.org/Article">

    
      <header class="post-header">

        
        
          <h1 class="post-title" itemprop="name headline">
            
            
              
                
                <a class="post-title-link" href="/2016/05/14/weekly-report-sophomore-2-12/" itemprop="url">
                  12周周报
                </a>
              
            
          </h1>
        

        <div class="post-meta">
          <span class="post-time">
            <span class="post-meta-item-icon">
              <i class="fa fa-calendar-o"></i>
            </span>
            <span class="post-meta-item-text">发表于</span>
            <time itemprop="dateCreated" datetime="2016-05-14T18:21:04+08:00" content="2016-05-14">
              2016-05-14
            </time>
          </span>

          

          
            
          

          

          
          

          
        </div>
      </header>
    


    <div class="post-body" itemprop="articleBody">

      
      

      
        
          
            <p>汇报给我自己。</p>
<p>#人生第一场足球赛</p>
<p>周三中午替薛森作为 Adobe 队的一员去踢了一场工大杯，这是我人生中的第一场正式的足球赛。</p>
<p>我的收获：</p>
<ul>
<li>足球确实很好玩！</li>
<li>但还是觉得打篮球舒服…</li>
<li>虽然不会踢，但还可以防守。防守不需要啥技术，跑就是了，加上体能和意志。</li>
<li>输也得站直了输。</li>
<li>上学期的足球课分挺低的，我当时还在想，报足球是不是一个错误，还不如继续上篮球拿个高分。但现在我觉得我体会到了足球的乐趣，也许将来还会踢更多的球，谁知道呢。多少分都无所谓了。因为这个报足球的决定，过了多少多少年后，也许我还能踢球，但早就忘了我当年拿的是A还是C。</li>
</ul>
<p>#做完了计原Peoject2</p>
<ul>
<li>回家和我妈聊天的时候试图讲了讲我对计原的理解，我大概是这么说的<ul>
<li>遍地都是计算机(电脑、手机、电饭煲)，他们的本质基本都一样。</li>
<li>计算机有五个组成部分(运算器、控制器、存储器、输入设备、输出设备)</li>
<li>计算机储存数据的方式：用0和1</li>
<li>计算机运行的模式：执行由一串0和1组成的指令</li>
<li>指令的格式不同(x86, ARM, MIPS,etc)，但大体模式都一样</li>
<li>过程是：①取指令 ②翻译指令(产生控制信号+读数据) ③进行运算 ④将数据保存起来。 </li>
</ul>
</li>
<li>我觉得把能什么东西讲出来会给我带来很大的快乐。</li>
</ul>

          
        
      
    </div>

    <div>
      
    </div>

    <div>
      
    </div>

    <footer class="post-footer">
      

      

      
      
        <div class="post-eof"></div>
      
    </footer>
  </article>


    
      

  
  

  
  
  

  <article class="post post-type-normal " itemscope itemtype="http://schema.org/Article">

    
      <header class="post-header">

        
        
          <h1 class="post-title" itemprop="name headline">
            
            
              
                
                <a class="post-title-link" href="/2016/04/16/i386/" itemprop="url">
                  32位还是64位？ | 七系
                </a>
              
            
          </h1>
        

        <div class="post-meta">
          <span class="post-time">
            <span class="post-meta-item-icon">
              <i class="fa fa-calendar-o"></i>
            </span>
            <span class="post-meta-item-text">发表于</span>
            <time itemprop="dateCreated" datetime="2016-04-16T16:27:56+08:00" content="2016-04-16">
              2016-04-16
            </time>
          </span>

          

          
            
          

          

          
          

          
        </div>
      </header>
    


    <div class="post-body" itemprop="articleBody">

      
      

      
        
          <p><img src="http://7xku3h.com1.z0.glb.clouddn.com/16-4-16/8400451.jpg" alt=""></p>
<p>这是 MySQL 下载页面列表的部分截图，可以发现名字同样的软件，分为了 amd64 和 i386。</p>
<p>同样的，还有一系列词汇，例如</p>
<ul>
<li>x86</li>
<li>x86_64</li>
<li>i386</li>
<li>i586</li>
<li>i686</li>
<li>amd64</li>
<li>x64</li>
</ul>
<p>他们到底是什么意思，有什么区别呢？</p>
<p>此文分析一下。如果有错误还请指出</p>
          <div class="post-more-link text-center">
            <a class="btn" href="/2016/04/16/i386/#more" rel="contents">
              阅读全文 &raquo;
            </a>
          </div>
        
      
    </div>

    <div>
      
    </div>

    <div>
      
    </div>

    <footer class="post-footer">
      

      

      
      
        <div class="post-eof"></div>
      
    </footer>
  </article>


    
      

  
  

  
  
  

  <article class="post post-type-normal " itemscope itemtype="http://schema.org/Article">

    
      <header class="post-header">

        
        
          <h1 class="post-title" itemprop="name headline">
            
            
              
                
                <a class="post-title-link" href="/2016/04/12/first-commit-at-github/" itemprop="url">
                  第一次在 Github 上贡献代码
                </a>
              
            
          </h1>
        

        <div class="post-meta">
          <span class="post-time">
            <span class="post-meta-item-icon">
              <i class="fa fa-calendar-o"></i>
            </span>
            <span class="post-meta-item-text">发表于</span>
            <time itemprop="dateCreated" datetime="2016-04-12T13:29:59+08:00" content="2016-04-12">
              2016-04-12
            </time>
          </span>

          

          
            
          

          

          
          

          
        </div>
      </header>
    


    <div class="post-body" itemprop="articleBody">

      
      

      
        
          
            <p>如果想了解 Git 和 Github，推荐阅读<a href="http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/" target="_blank" rel="external">廖雪峰的 Git 教程</a>。</p>
<hr>
<p>好吧，其实我贡献的不是代码。是一个程序员在 Github 上发布的电子书，我为发布者更改了几个小错误。不过不管怎么说，这是我第一次在 Github 上正经给别人贡献东西。</p>
<p>电子书是 <a href="http://growth.phodal.com/" target="_blank" rel="external">Growth: 全栈增长工程师指南</a>，Github 地址是 <a href="https://github.com/phodal/growth-ebook/" target="_blank" rel="external">growth-ebook</a>。 谢谢 @小文学长 在朋友圈的分享。如果连接打不开，请看文章底部的连接。</p>
<p>发布者说：</p>
<blockquote>
<p>阅读过程中遇到语法错误、拼写错误、技术错误等等，不烦来个Pull Request，这样可以帮助到其他阅读这本电子书的童鞋。</p>
</blockquote>
<p>正好，我在阅读的过程中发现了一些大小写、错别字的问题，我干脆就提交一个 Pull Request. </p>
<p>##1. fork 项目</p>
<p>如果想为其他人的 Github 项目做贡献，需要先将他的项目 fork 一份到自己的 Github 账号。</p>
<p><img src="http://7xku3h.com1.z0.glb.clouddn.com/16-4-12/77361122.jpg" alt=""></p>
<p>就是最右边这个 Fork。</p>
<p>##2. clone 项目</p>
<p>然后将已经 fork 到<strong>自己账号下的项目</strong>克隆到本地。</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">git clone https://github.com/wangyufeng0615/growth-ebook.git</div></pre></td></tr></table></figure>
<p>向我这次提交的这种小 BUG 修复，就没必要单独新建一个 branch.</p>
<p>于是我直接在源文件中修改了一些大小写，和错别字，例如</p>
<p><img src="http://7xku3h.com1.z0.glb.clouddn.com/16-4-12/26774216.jpg" alt=""></p>
<p><img src="http://7xku3h.com1.z0.glb.clouddn.com/16-4-12/84647919.jpg" alt=""></p>
<p>诸如此类十处左右。</p>
<p>本地更新的方式就和单机使用 Git 一样。</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">git add .</div><div class="line">git commit -m &quot;统一大小写, 更正错别字&quot;</div><div class="line">git push</div></pre></td></tr></table></figure>
<ol>
<li>我觉得 commit 的信息需要写详细一些，毕竟这些信息是要给所有人看的，类似于我们做大物实验，要填写台子上的”使用手册”。虽然我一次也没写过。</li>
<li>这个 push 是 push 到自己的主页中的项目。不是项目发起人的项目。</li>
</ol>
<p>##3. 发起 Pull Request</p>
<p>从<strong>自己的页面的该项目</strong>中点那个绿色的 New pull requrst.</p>
<p><img src="http://7xku3h.com1.z0.glb.clouddn.com/16-4-12/4715713.jpg" alt=""></p>
<p>然后可以对比代码的不同、填写注释信息等。</p>
<p><img src="http://7xku3h.com1.z0.glb.clouddn.com/16-4-12/11253949.jpg" alt=""></p>
<p>再点”Create pull request”就可以了。如果项目管理员觉得你这个 pull request 没问题，就会把你的代码 merge 进项目。</p>
<p>这个作者速度很快，我还没截图他就把我的 pull request 给 merge 了。如图：</p>
<p><img src="http://7xku3h.com1.z0.glb.clouddn.com/16-4-12/87890627.jpg" alt=""></p>
<p>从图中可以看出，作者将我的 commit 合并到了主分支中，并对我表示了感谢~~~现在我就是这个开源项目的贡献者之一了。很惭愧，只是做了一点微小的贡献。</p>
<p>给开源项目做贡献，在大多数情况下都应该是没有直接的物质回报，但这种人与人之间真诚的感谢，大概也是回报的一种吧。</p>
<p>##4. 其他问题</p>
<p>如果我把那个人的项目 fork 到本地后，我还没改完呢，作者已经提交新的 commit 了，他的内容和我本地的内容发生了变化，怎么办？</p>
<p>需要用<code>git rebase</code>指令让本地内容和上游库同步。这个事情我这次没实践。</p>
<p>##5. 参考资料</p>
<ul>
<li>(<a href="http://blog.csdn.net/zhangdaiscott/article/details/17438153" target="_blank" rel="external">http://blog.csdn.net/zhangdaiscott/article/details/17438153</a>)</li>
<li>Growth: 全栈增长工程师指南(<a href="http://growth.phodal.com/" target="_blank" rel="external">http://growth.phodal.com/</a>)</li>
<li>Github: growth-ebook(<a href="https://github.com/phodal/growth-ebook/" target="_blank" rel="external">https://github.com/phodal/growth-ebook/</a>)</li>
</ul>

          
        
      
    </div>

    <div>
      
    </div>

    <div>
      
    </div>

    <footer class="post-footer">
      

      

      
      
        <div class="post-eof"></div>
      
    </footer>
  </article>


    
      

  
  

  
  
  

  <article class="post post-type-normal " itemscope itemtype="http://schema.org/Article">

    
      <header class="post-header">

        
        
          <h1 class="post-title" itemprop="name headline">
            
            
              
                
                <a class="post-title-link" href="/2016/04/11/char-to-tchar/" itemprop="url">
                  EasyX中的TCHAR转换
                </a>
              
            
          </h1>
        

        <div class="post-meta">
          <span class="post-time">
            <span class="post-meta-item-icon">
              <i class="fa fa-calendar-o"></i>
            </span>
            <span class="post-meta-item-text">发表于</span>
            <time itemprop="dateCreated" datetime="2016-04-11T08:41:21+08:00" content="2016-04-11">
              2016-04-11
            </time>
          </span>

          

          
            
          

          

          
          

          
        </div>
      </header>
    


    <div class="post-body" itemprop="articleBody">

      
      

      
        
          
            <p>EasyX 库中的 <code>outtextxy()</code>函数只能接受<code>TCHAR</code>格式的参数。</p>
<p>提供几种用过的常用数据格式转<code>TCHAR</code>的方法，供参考。如果不行，不妨再用 Google。关键词：xxx to TCHAR.</p>
<p>ps. <code>wchar_t</code> 和 <code>TCHAR</code> 在EasyX的应用中是一个意思，用哪个都行。他们都是为了处理Unicode字符而存在的，在咱们的EasyX程序中就是为了处理中文，但是其他西文字符也得转成TCHAR。</p>
<hr>
<p>说明：</p>
<ul>
<li>源数据：source</li>
<li>转换后的数据：dest</li>
</ul>
<p>###先要包含头文件<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">#include &lt;tchar.h&gt;</div></pre></td></tr></table></figure></p>
<p>###直接输出TCHAR</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">outtextxy(x, y,  _T(&quot;要输出的字符串&quot;));</div></pre></td></tr></table></figure>
<p>###string 转 TCHAR</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div></pre></td><td class="code"><pre><div class="line">//先包含头文件</div><div class="line">#include &lt;atlstr.h&gt;	</div><div class="line"></div><div class="line">_tcscpy_s(dest, CA2T(source.c_str()));</div></pre></td></tr></table></figure>
<h3 id="int-转-TCHAR"><a href="#int-转-TCHAR" class="headerlink" title="int 转 TCHAR"></a>int 转 TCHAR</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">_stprintf_s(dest, _T(&quot;%d&quot;), source);</div></pre></td></tr></table></figure>
<h3 id="char-转-TCHAR"><a href="#char-转-TCHAR" class="headerlink" title="char 转 TCHAR"></a>char 转 TCHAR</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">_stprintf_s(dest, _T(&quot;%c&quot;), source);</div></pre></td></tr></table></figure>
<p>或者 </p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">MultiByteToWideChar(CP_ACP, 0, source, 20, dest, 20);</div><div class="line">//20是长度</div></pre></td></tr></table></figure>
          
        
      
    </div>

    <div>
      
    </div>

    <div>
      
    </div>

    <footer class="post-footer">
      

      

      
      
        <div class="post-eof"></div>
      
    </footer>
  </article>


    
      

  
  

  
  
  

  <article class="post post-type-normal " itemscope itemtype="http://schema.org/Article">

    
      <header class="post-header">

        
        
          <h1 class="post-title" itemprop="name headline">
            
            
              
                
                <a class="post-title-link" href="/2016/04/07/c-switch/" itemprop="url">
                  C 语言中为什么有 switch？ | 七系
                </a>
              
            
          </h1>
        

        <div class="post-meta">
          <span class="post-time">
            <span class="post-meta-item-icon">
              <i class="fa fa-calendar-o"></i>
            </span>
            <span class="post-meta-item-text">发表于</span>
            <time itemprop="dateCreated" datetime="2016-04-07T18:30:02+08:00" content="2016-04-07">
              2016-04-07
            </time>
          </span>

          

          
            
          

          

          
          

          
        </div>
      </header>
    


    <div class="post-body" itemprop="articleBody">

      
      

      
        
          
            <p>如果文中有BUG，请留言反馈，谢谢~</p>
<hr>
<p>C语言中，有且仅有三种基本语句结构</p>
<ol>
<li>顺序结构</li>
<li>循环结构(<code>while</code>, <code>for</code>等)</li>
<li>条件结构</li>
</ol>
<p>其中，条件结构有<code>if-else</code>和<code>switch-case</code>两种。还有<code>三元运算符</code>，形如<code>a &gt; b ? c : d;</code>不常用。</p>
<p>经常地，<code>if-else</code>结构和<code>switch-case</code>结构可以相互转化。比如：</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div></pre></td><td class="code"><pre><div class="line">switch (day)</div><div class="line">&#123;</div><div class="line">    case &apos;1&apos; : printf(&quot;Monday\n&quot;);  break;</div><div class="line">    case &apos;2&apos; : printf(&quot;Tuesday\n&quot;); break;</div><div class="line">    case 1 : printf(&quot;1\n&quot;); break;	//注意1和&apos;1&apos;的区别</div><div class="line">    default : printf(&quot;error\n&quot;);</div><div class="line">&#125;</div></pre></td></tr></table></figure>
<p>可以转换成</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div></pre></td><td class="code"><pre><div class="line">if (day == &apos;1&apos;)</div><div class="line">&#123;</div><div class="line">    printf(&quot;Monday\n&quot;);</div><div class="line">&#125; </div><div class="line">else if (day == &apos;2&apos;)</div><div class="line">&#123;</div><div class="line">    printf(&quot;Tuesday\n&quot;);</div><div class="line">&#125; </div><div class="line">else if (day == 1)</div><div class="line">&#123;</div><div class="line">    printf(&quot;1\n&quot;);</div><div class="line">&#125;</div><div class="line">else</div><div class="line">&#123;</div><div class="line">    printf(&quot;error\n&quot;)</div><div class="line">&#125;</div></pre></td></tr></table></figure>
<p>两者实现的功能是一样的。一般来说，<code>if-else</code>结构相对于<code>switch-case</code>结构来说更为灵活一些，比如，分支的条件可以是”一定范围”，但<code>switch-case</code>结构的条件变量必须是整数或字符，或枚举型。</p>
<hr>
<p>题外话：这里想强调的是，<code>switch-case</code>结构中的条件变量（例如本例中的<code>day</code>），如果存的是整数，需要注意数字和字符的区别。例如</p>
<p>1</p>
<p>表示整数1。而</p>
<p>`1`</p>
<p>表示字符`1`，对应的ASCII码为49。</p>
<p>具体使用哪种，取决于你条件变量(<code>day</code>)的类型，例如，<code>int day;</code>或是<code>char day;</code>分别对应例子的前者和后者。这种<code>int</code>和<code>char</code>类型间的关系容易混淆，这是我学习 C 语言过程的困扰过我的问题。</p>
<p>另外，在使用<code>switch-case</code>语句时，容易漏<code>break;</code>语句和<code>default</code>默认分支。虽然不写也可以，但容易引起BUG，且编译器不会报错。</p>
<hr>
<p>上面提到，<code>switch-case</code>结构的条件变量只能是一个确定的值，比如数字或单个字符，所以有时候<code>switch-case</code>结构并不适用，比如我这届以及我下一届的 C 语言课程都有这样一道课后作业，大意是90-100分是优，80-89分是良，要求统计全班优良信息，要求用<code>if-else</code>结构和<code>switch-case</code>结构分别实现。这种”范围判断”的情况，就不适合使用<code>switch-case</code>结构。这种情况，用<code>if-else</code>结构的话，很方便可以实现，例如</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div></pre></td><td class="code"><pre><div class="line">if (grade &lt; 100 &amp;&amp; grade &gt; 90)</div><div class="line">&#123;</div><div class="line">	//xxx</div><div class="line">&#125;</div></pre></td></tr></table></figure>
<p>注意，下面这样是不行滴，至少在C语言中不行。</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">if (90 &lt; grade &lt; 100)</div></pre></td></tr></table></figure>
<p>那么，或许产生这样的疑问：既然所有的<code>switch-case</code>结构都能转换成<code>if-else</code>结构，那为什么还要有<code>switch-case</code>结构呢？</p>
<p>结合资料，我说一下我自己的看法。</p>
<p>###是为了速度快</p>
<p>这学期我们学”计算机组成原理”，学到了MIPS指令这块，书中提到了<code>switch-case</code>语句的实现和<code>if-else</code>语句的区别之处，摘抄如下（《计算机组成与设计》中文第五版 P64）</p>
<blockquote>
<p>大多数程序设计语言中都包括 case 和 switch 语句，使得程序员可以根据某个变量的值选择不同分支之一。实现 switch 语句的最简单方法是借助一系列的条件判断，将 switch 语句转化为 if-then-else 语句。</p>
<p>有时候另一种更有效的方法是将多个指令序列分支的地址编码为一张表，即<strong>转移地址表(jump address table)</strong>或<strong>转移表(jump table)</strong>，这样程序只需索引该表即可跳转到恰当的指令序列。</p>
</blockquote>
<p>总之，用这种转移表，再使用<code>jr</code>(jump register)指令，就能直接跳转到寄存器中存放的地址。速度会比较快。<code>if-else</code>结构，需要从头到尾一一比对，<code>switch-case</code>结构，直接查表就可以了。这种思路类似我觉得类似于路由控制表，即，建立一种一一对应的关系，避免遍历。</p>
<p>C语言是上世纪70年代发明的，那时候计算机的速度远远不及今天这样快，计算能力也不富裕，所以性能上能省则省。像当今时代的 Java、Python 等等编程语言，执行速度通常比C语言慢，但是换来了更好的安全性、易用性等。Python 语言的语法继承自C语言，但是就没有<code>switch-case</code>结构。</p>
<p>我想，有种更加量化的办法来验证两者的区别，即，用两种结构分别写两段功能上等价的代码，然后对比编译后的汇编代码。</p>
<p>以上是我对 C 语言中<code>switch-case</code>结构的一些理解。</p>

          
        
      
    </div>

    <div>
      
    </div>

    <div>
      
    </div>

    <footer class="post-footer">
      

      

      
      
        <div class="post-eof"></div>
      
    </footer>
  </article>


    
  </section>

  
  <nav class="pagination">
    <span class="page-number current">1</span><a class="page-number" href="/page/2/">2</a><span class="space">&hellip;</span><a class="page-number" href="/page/6/">6</a><a class="extend next" rel="next" href="/page/2/"><i class="fa fa-angle-right"></i></a>
  </nav>



          </div>
          


          

        </div>
        
          
  
  <div class="sidebar-toggle">
    <div class="sidebar-toggle-line-wrap">
      <span class="sidebar-toggle-line sidebar-toggle-line-first"></span>
      <span class="sidebar-toggle-line sidebar-toggle-line-middle"></span>
      <span class="sidebar-toggle-line sidebar-toggle-line-last"></span>
    </div>
  </div>

  <aside id="sidebar" class="sidebar">
    <div class="sidebar-inner">

      

      

      <section class="site-overview sidebar-panel  sidebar-panel-active ">
        <div class="site-author motion-element" itemprop="author" itemscope itemtype="http://schema.org/Person">
          <img class="site-author-image" itemprop="image"
               src="/images/avatar.gif"
               alt="Alan" />
          <p class="site-author-name" itemprop="name">Alan</p>
          <p class="site-description motion-element" itemprop="description">Alan Wang's personal blog.</p>
        </div>
        <nav class="site-state motion-element">
          <div class="site-state-item site-state-posts">
            <a href="/archives">
              <span class="site-state-item-count">57</span>
              <span class="site-state-item-name">日志</span>
            </a>
          </div>

          
            <div class="site-state-item site-state-categories">
              
                <span class="site-state-item-count">9</span>
                <span class="site-state-item-name">分类</span>
              
            </div>
          

          
            <div class="site-state-item site-state-tags">
              
                <span class="site-state-item-count">4</span>
                <span class="site-state-item-name">标签</span>
              
            </div>
          

        </nav>

        

        <div class="links-of-author motion-element">
          
        </div>

        
        

        
        

      </section>

      

    </div>
  </aside>


        
      </div>
    </main>

    <footer id="footer" class="footer">
      <div class="footer-inner">
        <div class="copyright" >
  
  &copy; 
  <span itemprop="copyrightYear">2016</span>
  <span class="with-love">
    <i class="fa fa-heart"></i>
  </span>
  <span class="author" itemprop="copyrightHolder">Alan</span>
</div>

<div class="powered-by">
  Powered by <a class="theme-link" href="https://hexo.io">Hexo</a> 
</div>

<div class="theme-info">
  主题 -
  <a class="theme-link" href="https://github.com/iissnan/hexo-theme-next">
    NexT.Pisces
  </a>
</div>

        

        
      </div>
    </footer>

    <div class="back-to-top">
      <i class="fa fa-arrow-up"></i>
    </div>
  </div>

  

<script type="text/javascript">
  if (Object.prototype.toString.call(window.Promise) !== '[object Function]') {
    window.Promise = null;
  }
</script>









  



  
  <script type="text/javascript" src="/vendors/jquery/index.js?v=2.1.3"></script>

  
  <script type="text/javascript" src="/vendors/fastclick/lib/fastclick.min.js?v=1.0.6"></script>

  
  <script type="text/javascript" src="/vendors/jquery_lazyload/jquery.lazyload.js?v=1.9.7"></script>

  
  <script type="text/javascript" src="/vendors/velocity/velocity.min.js?v=1.2.1"></script>

  
  <script type="text/javascript" src="/vendors/velocity/velocity.ui.min.js?v=1.2.1"></script>

  
  <script type="text/javascript" src="/vendors/fancybox/source/jquery.fancybox.pack.js?v=2.1.5"></script>


  


  <script type="text/javascript" src="/js/src/utils.js?v=5.0.1"></script>

  <script type="text/javascript" src="/js/src/motion.js?v=5.0.1"></script>



  
  


  <script type="text/javascript" src="/js/src/affix.js?v=5.0.1"></script>

  <script type="text/javascript" src="/js/src/schemes/pisces.js?v=5.0.1"></script>



  

  


  <script type="text/javascript" src="/js/src/bootstrap.js?v=5.0.1"></script>



  



  




  
  

  

  

  

</body>
</html>
